web6047 バックナンバー


web6047 2024年 2月

■ 今 私が iTunes で聞いている音楽

Play start time: 2024/04/28 Sun. 21:19:49 [4日前]
 針の城
サガ フロンティア オリジナル・サウンドトラック / 伊藤賢治
Good: 0
LIVE DISP.

■最近観た映画

2024年2月25日(日) 映画「3022」(吹替)

SF/2019年アメリカ/91分/公的評価:★★☆☆☆(2.0)私的評価:★★★☆☆(2.9)

――木星の衛星エウロパへの移民の中継として、地球から移動に 3 カ月かかる場所に「国際宇宙ステーション」が設立された。

国々が 10 年ごとに交代で管理することになり、そしてアメリカの 10 年が始まった。しかし ――

監督も役者たちも知らない人ばかりで、2流映画という感じがします。

でもおおむねしっかりとした作りで、そんなには残念に思うところも少ないと思います。

「それでどうするの??」という感じで終わってしまいますが、まぁ、まとまっていると言えばまとまっています。

「娘を探そうとした気持ちが、今になって分かった」

という一言がテーマに関わるところかなと思いましたが、その辺もうちょっと上手に描けたら良かったと思います。インターステラーみたいに親子でちょっかい出し合うところを描くとか…それがダンスシーンかなぁ…


人々による「公的評価」が低い理由は、レビューをざっと見たところ、

…私としては、5段階評価の半分 2.5 よりやや上の及第点(可)でした。


■ 日記

2024/2/10(土)

ゲーム「クレイジーバルーン」

MZ版クレイジーバルーン《JavaScript》

【ゲームの方法】

  1. 障害物を避けながらSTARTからGOALへ風船を運んでください。風船は障害物に触れると割れてしまいます。
  2. 風船の移動キー(キーボード、またはソフトウェア・キーボード)





  3. 風船は4つです。全部割ってしまうとゲームオーバーです。

Full Screen (F) Enter

SPACE

――― 昔、私が小学5年生の頃、父が「会社に使っていないパソコンがある」と言って、私を会社に連れて行ってくれました。父が引き取りの手続きをしている間、私は職場の父の席か知りませんが、PC-98 か何かのパソコンの前に座って何かのゲームで遊んでいました。そのとき見たのはフロッピーディスクでしたが、5インチではなく8インチのでかいやつでした。

そして家に帰り、青焼き複写機(ジアゾ複写機)の青っぽい紙の入門本とかサンプルプログラムの本、カセットテープに入ったいろいろなプログラムで遊びました。

「どれ、見せてみろ」と父に言われて、この「クレイジー・バルーン」を起動させて、二人で遊んだ、という思い出があります。

裏技はそのとき私が気づいたもので、「邪道だな!」と父に言われました。


2024/2/3(土)

どう解釈すればいいのか

同じ話題を Yahoo 知恵袋でも、私からの質問として投稿しています。これ

もし答えてあげましょうというガッツがあなたにあるのなら答えてみてください。

(なんとなく、ガッツがないと答えられないような難しい話題に思えます。オブジェクト指向のこんな挙動見たことないから)


以下は C++ のプログラムです。(後のほうに Java 版もあります)

特別難しいことはやっていなくて、ABC というクラスがあり、そして ABC を継承した DEF というクラスがあります。

また、2つの変数 x, y はどちらも同じ流れで同じ値を代入しています。

しかし y だけ、x とは一部異なっていて、派生クラスの DEF の中で、「int y;」という再宣言の行をコメントアウトしています。

(あまり丁寧な言い方ではなくすみませんが、なぜ再宣言しているのかは問題ではありません)

x, y は直接アクセス可能であり、それでいて getX(), getY() でもアクセスできます。

この x, y に対し、直接アクセスと、getX(), getY() でアクセスしよう、というプログラムになっています。

#include <iostream>

class ABC {
public:
    int x;
    int y;

    ABC() {
        x = 123;
        y = 123;
    }
    int getX() { return x; }
    int getY() { return y; }
};


class DEF : public ABC {
public:
    int x;
//  int y;

    DEF() {
        x = 456;
        y = 456;
    }
};


int main() {
    DEF abc;
    std::cout << "x = " << abc.x << ", getX() = " << abc.getX() << "\n";
    std::cout << "y = " << abc.y << ", getY() = " << abc.getY() << "\n";
}

その実行結果がこれです。

なぜ、派生クラスの中で変数 x を再宣言すると、getX() は基本クラス ABC の x の値 123 を表示するのでしょうか?


これが C++ 特有の動きなのかどうかと思って、Java で同じプログラムを作って試してみました。

class ABC {
    int x;
    int y;
   
    ABC() {
        this.x = 123;
        this.y = 123;
    }
    int getX() { return this.x; }
    int getY() { return this.y; }
}

class DEF extends ABC {
    int x;
//  int y;

    DEF() {
        this.x = 456;
        this.y = 456;
    }
}

public class HelloWorld {

    public static void main( String[] args ){
        DEF abc = new DEF();
        System.out.println( "x = " + abc.x + ", getX() = " + abc.getX() );
        System.out.println( "y = " + abc.y + ", getY() = " + abc.getY() );
    }
}

その実行結果がこれです。

なんと同じ結果となりました。

私が無知なのか、それともボサッとしていて当たり前の何かに気づいていないだけなのか、、、


そもそも派生クラスというのは基本クラスのコンストラクタの実行結果を、同じ変数名だとしても別件で持っているものなのでしょうか?

でも私が思ったのは、

基本クラスとは別に、派生クラスで int x; とした時点で、両者で変数 x は分離して(別々にメモリ確保され)、そして、getX() はもともとは基本クラスのものだから、そこで参照される x は基本クラスのほうとなる。

なのかなぁ。そんなことあるかなぁ。

この動き、どう解釈すればいいのか。


2024年2月8日(木) 知恵袋上で解決できました。

以下のように理解しました。

DEF の x は ABC の x を、グローバル変数と同名のローカル変数の関係のように、「隠ぺい」(シャドウイング)します。ローカル変数が定義されてもグローバル変数が消えたりしないのと同じように、ABC の x は DEF の x により上書きされたりせず、名前は同じだけどそれぞれ存在します。

いっぽう ABC で定義された getX() は ABC の x を参照します。たとえ ABC を継承した DEF から getX() を呼び出したとしても、変わらず ABC の x を参照します。

つまり、基本クラスで定義された変数やメソッドを派生クラスから参照すると、それはまるで(「継承した」というくらいだし)派生クラスのものであるかのように思えますが、あくまでも基本クラスのものです。継承したと言ってもコピーされて同化したのではなく、別個に分けて存在しています。


DEF において、(DEF で定義された)x に対してどのように代入が行われても、隠ぺいの仕組みによって ABC の x は保存されます。そして getX() は ABC の x を参照するので、getX() は (隠ぺいにより保存された)123 を返します。

これは C++、Java、C# などいずれのオブジェクト指向言語でも同じ結果となります。

知恵袋では8人の方々から回答をもらい、わりと多くの方がこの現象について正しく解説してくれました。

失礼ながら、最初は「この人知識が浅いんじゃないか」と思ったりしましたが、いろいろ理解するうちに、知識が浅いのは私のほうだと思い直したりしました。

現象が(浅い知識を持っている人にとっては)予想外の動きをしているため、正しい知識に対して「そんなわけない」みたいに思ってしまうんですね。

半端な知識を持っていると、正しいことを「間違えている」と言ってしまう場合があって、こわいですね。

いろいろ勉強になった知恵袋の「質問」でした。



ここはページの一番下です